<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script type="text/javascript">
    
        // 现在浏览器执行代码的标准是 基于es3.0的和es5.0
        // 新增的方法使用的，对于产生冲突的用的是es3的
        // es5.0严格模式，es3.0 和 es5.0产生冲突的部分使用es5.0的标准


    
        "use strict"; 
        //在最顶端写上这句话就启用了es5.0严格模式
        // 必须写在逻辑的最顶端
        // 也可以写在函数里面的第一行
        // 设计成字符串的形式是为了兼容老版本的浏览器，识别不了也不会报错


/////////////////////////        
        // function test() {
        //     console.log(arguments.callee);
        // }
        // test();
    
////////////////////////////////////////////
        
        // var obj = {
        //     name: 'obj'
        // }
        // var name = 'window';

        // function test() {
        //     var name = 'scope';
        //     with(obj) {  //可以改变作用域链，让with里面的对象放在代码块的作用域链的最顶端
        //         console.log(name);
        //     }
        //     // 通过with可以简化代码
        // }
        // test();

        // with(document) {
        //     write('a');
        // }
        // // with 会消耗大量的效率去更改作用域链

/////////////////////////////////////////////
        // b = 123;
        // 变量赋值前必须声明，不然会报引用错误，is not defined


/////////////////////////////////////

        function test() {
            console.log(this);
        }
        test(); // 预编译this不再指向window，为undefined
        new test(); // test {} 
        
        test.call(123);// 不是严格模式时，会生成包装类
        // 在严格模式中，传什么就是什么


        // this全局还是指向window


///////////////
        function a(name, name){}
        //函数中重复的参数在es5是不行的，而在普通模式下，不报错
        //拒绝重复的属性名，应该报错，但是浏览器和标准不兼容，和正常模式实现起来没差别
        var obj = {
            name: 123,
            name: 234 // 正常模式下，后面的覆盖上面的
        }

        

    </script>
</body>
</html>